package com.his.j259w264.service.impl;

import com.his.j259w264.pojo.RegistrationInformation;
import com.his.j259w264.mapper.RegistrationInformationMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 挂号信息表(RegistrationInformation)表服务实现类
 *
 * @author EdgeYu
 * @version 1.0
 * @since 2021-09-15 20:27:16
 */

@Service("registrationInformationService")
public class RegistrationInformationServiceImpl {
    @Resource
    private RegistrationInformationMapper registrationInformationMapper;

    /**
     * 根据模糊条件查询总个数
     *
     * @param patientName 查询条件
     * @return 返回查询到的总个数
     */
    public Map<String, Object> selectForCount(String patientName, String idCard, String startTime, String endTime) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", this.registrationInformationMapper.selectForCount(patientName, idCard, startTime, endTime));
        return map;
    }

    /**
     * 查询所有数据
     *
     * @return 返回所有数据
     */
    public Map<String, Object> selectAll() {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", this.registrationInformationMapper.selectAll());
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    public Map<String, Object> selectById(Integer id) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", this.registrationInformationMapper.selectById(id));
        return map;
    }

    /**
     * 查询分页数据
     *
     * @param index 查询起始位置
     * @param patientName  查询条件
     * @param limit 分页数量
     * @return 对象列表
     */
    public Map<String, Object> selectForPage(int index, int limit, String patientName, String idCard, String startTime, String endTime) {
        if(startTime==null||"".equals(startTime)||endTime==null||"".equals(endTime)){
            startTime=new SimpleDateFormat("yyyy-MM-dd 00:00:00").format(new Date());
            endTime=null;
        }

        // 获取当前表中的总记录
        int tableCount = this.registrationInformationMapper.selectForCount(patientName, idCard, startTime, endTime);
        // 总页码计算   (总条数 - 1) / 每页显示条数  + 1
        // (100 - 1) / 10 + 1 = 10        (101 - 1) / 10 + 1 = 11      (99 - 1) / 10 + 1 = 10
        int pageCount = (tableCount - 1) / limit + 1;
        // 计算每页开始的下标值
        index = (index - 1) * limit;
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        // 查询的记录总页码
        map.put("pageCount", pageCount);
        // 当前表中的总条数
        map.put("count", tableCount);
        map.put("data", this.registrationInformationMapper.selectForPage(index, limit, patientName, idCard, startTime, endTime));
        return map;
    }

    /**
     * 新增数据
     *
     * @param registrationInformation 实例对象
     * @return 实例对象
     */
    public Map<String, Object> insert(RegistrationInformation registrationInformation) {
        // UUID.randomUUID()  返回内容：asd21321-ewrewrew213213-123213zsad-123asdasd这样的形态
        this.registrationInformationMapper.insert(registrationInformation);
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "新增成功");
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param registrationInformation 实例对象
     * @return 实例对象
     */
    public Map<String, Object> updateById(RegistrationInformation registrationInformation) {
        this.registrationInformationMapper.updateById(registrationInformation);
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "更新成功");
        return map;
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    public Map<String, Object> deleteById(Integer id) {
        this.registrationInformationMapper.deleteById(id);
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "删除成功");
        return map;
    }

    public Map<String, Object> insertByPatientIdAndDepartmentName(Integer patientId,String departmentName){
        long serialNo = (System.currentTimeMillis()+patientId);
        int receptionState = 0;
        String registrationTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        registrationInformationMapper.insertByPatientIdAndDepartmentName(patientId,departmentName,serialNo,receptionState,registrationTime);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "新增成功");
        return map;
    }

    public Map<String, Object> updateReceptionStateById(Integer registrationInformationId) {
        this.registrationInformationMapper.updateReceptionStateById(registrationInformationId);
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "更新成功");
        return map;
    }
}
